/*
 * Copyright (c) Huawei Technologies Co., Ltd. 2018-2022. All rights reserved.
 */

package com.huawei.knowledge;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.TemplateType;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import lombok.extern.slf4j.Slf4j;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * Mybatis-plus代码生成器
 *
 * @author wWX1055651
 * @since 2022-11-29
 */
@Slf4j
public class MybatisAutoGenerator {
    public static void main(String[] args) {
        // 要生成的数据库表名
        List<String> tableNames = Arrays.asList("knowledge_rag_data_add_info","knowledge_rag_data_cut_info");
        // 创建代码生成工具类
        FastAutoGenerator generator = create(tableNames);
        // 执行生成代码
        generator.execute();
    }

    private static FastAutoGenerator create(List<String> tableNames) {
        // 数据库连接地址
        String url = "jdbc:mariadb://10.27.108.177:3306/test?useUnicode=true&characterEncoding=utf-8"
                + "&allowMultiQueries=true&useSSL=false&serverTimezone=UTC";
        // 数据库用户名
        String name = "root";
        // 数据库密码
        String password = "";
        String projectPath = System.getProperty("user.dir");
        String moduleName = "knowledge";
        return FastAutoGenerator.create(url, name, password)
                // 全局配置
                .globalConfig(builder -> {
                    builder.outputDir(projectPath + "/src/main/java") // 指定输出目录
                            .dateType(DateType.TIME_PACK) // 设置生成的时间类型
                            .author("lwx1155848") // 设置author
                            .disableOpenDir() // 关闭生成后自动打开文件夹
                            .enableSwagger(); // 开启swagger模式
                })
                // 生成的代码包路径配置
                .packageConfig(builder -> {
                    builder.parent("com.huawei") // 设置父包名
                            .moduleName(moduleName) // 设置父包模块名
                            .pathInfo(Collections.singletonMap(OutputFile.xml,
                                    projectPath + "/src/main/resources/mapper/")) // 设置mapperXml的路径
                            .entity("model") // 设置实体类路径
                            .mapper("mapper") // 设置mapper路径
                            .service("service") // 设置服务类路径
                            .serviceImpl("service.impl"); // 设置服务实现类路径
                })
                // 生成策略配置
                .strategyConfig(builder -> {
                    builder.addInclude(tableNames) // 添加要生成的数据库表
                            .enableCapitalMode(); // 启用大写模式
                    builder.entityBuilder().naming(NamingStrategy.underline_to_camel) // 数据库表映射到实体的命名策略
                            .columnNaming(NamingStrategy.underline_to_camel) // 数据库表字段映射到实体的命名策略
                            .enableLombok() // 使用lombok
                            .enableTableFieldAnnotation() // 开启生成实体时生成字段直接
                            .idType(IdType.ASSIGN_ID) // 标记实例类的主键生成方式，如果插入时没有指定，则自动分配一个，默认是雪花算法
                            .enableFileOverride() // 实例类每次生成的时候，覆盖旧的实体类
                            .serviceBuilder() // 生成服务类和服务实现类
                            .convertServiceFileName(entityName -> entityName + "Service") // 生成的服务类名称
                            .convertServiceImplFileName(entityName -> entityName + "ServiceImpl"); // 生成的服务实现类名称
                }).templateEngine(new FreemarkerTemplateEngine()) // 设置模板
                .templateConfig(builder -> builder.disable(TemplateType.CONTROLLER)); // 不生成controller
    }
}
